home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / vbunrar / basunrar.bas next >
BASIC Source File  |  1999-09-11  |  11KB  |  271 lines

  1. Attribute VB_Name = "basUnrar"
  2.   Option Explicit
  3.   
  4.   '/
  5.   '/ basUnrar by EwareZ
  6.   '/
  7.   '/ mail: ewarez97@hotmail.com
  8.   '/ www: http://go.to/ewarez
  9.   '/
  10.   '/ I've read on several bulltinboards that unrar.dll isn't capable with vb5/6
  11.   '/ Well there wrong, I've figured out the most of important features of unrar.dll
  12.   '/
  13.   '/ You can use this to extract all files of a rararchive and unpack them to a dir
  14.   '/ of your choice, also multiple archives are allowed.
  15.   '/
  16.   '/ for the progress I had to figure out the total amount of bytes being unpack,
  17.   '/ the only stable thing I found was to test the archive first and count the bytes
  18.   '/ of each file. This testing goes quiet fast and you won't even notice it with small
  19.   '/ archive, it also check if multiple archivefiles are complete.
  20.   '/
  21.   '/ What I can't figure out (yet) is the callback, when a file is extracting from the
  22.   '/ archive the program freezes until it done. If someone has any suggestions about this
  23.   '/ please let me know.
  24.   '/
  25.   
  26.   
  27.   Dim udtRAR As RAROpenArchiveData
  28.   Dim lHandle As Long
  29.   Dim udtHeader As RARHeaderData
  30.   Dim lBytesCount As Long
  31.   Dim lBytesTotal As Long
  32.   Dim tmp As Long
  33.   Dim rtnRar As Long
  34.   Dim i
  35.   
  36.   Public RAR_ABORT As Boolean
  37.   
  38.   Const ERAR_END_ARCHIVE      As Long = 10 '/ end of archive
  39.   Const ERAR_NO_MEMORY        As Long = 11 '/ not enough memory to init data structures
  40.   Const ERAR_BAD_DATA         As Long = 12 '/ archive header broken
  41.   Const ERAR_BAD_ARCHIVE      As Long = 13 '/ not a valid rar archive
  42.   Const ERAR_UNKNOWN_FORMAT   As Long = 14 '/ unknow comment format
  43.   Const ERAR_EOPEN            As Long = 15 '/ file open error
  44.   Const ERAR_ECREATE          As Long = 16 '/ file create error
  45.   Const ERAR_ECLOSE           As Long = 17 '/ file close error
  46.   Const ERAR_EREAD            As Long = 18 '/ read error
  47.   Const ERAR_EWRITE           As Long = 19 '/ write error
  48.   Const ERAR_SMALL_BUF        As Long = 20 '/ buffer too small, comments are not read completly
  49.   Const ERAR_NORARDLL         As Long = 50 '/ Unrar.dll not found
  50.   Const RAR_OM_LIST           As Long = 0  '/ open archive for reading file headers only
  51.   Const RAR_OM_EXTRACT        As Long = 1  '/ open archive for testing and extracting files
  52.   Const RAR_SKIP              As Long = 0  '/ move to the next file in archive
  53.                                            '/ if the archive is solid and RAR_OM_EXTRACT
  54.                                            '/ mode was set when the archive was opened,
  55.                                            '/ the current file will be processed - the
  56.                                            '/ operation will be performed slower than a
  57.                                            '/ single seek
  58.   Const RAR_TEST              As Long = 1  '/ Test the current file and move to the next
  59.                                            '/ file in the archive. If the archive was opened
  60.                                            '/ with RAR_OM_LIST mode, the operation is equal
  61.                                            '/ to RAR_SKIP.
  62.   Const RAR_EXTRACT           As Long = 2  '/ Extract the current file and move to the next
  63.                                            '/ file in the archive. If the archive was opened
  64.                                            '/ with RAR_OM_LIST mode, the operation is equal
  65.                                            '/ to RAR_SKIP
  66.   Const RAR_VOL_ASK           As Long = 0  '/ Required volume is absent. The function should
  67.                                            '/ prompt user and return non-zero value to retry
  68.                                            '/ the operation. The function may also specify a
  69.                                            '/ new volumename, placing it to ArcName parameter.
  70.   Const RAR_VOL_NOTIFY        As Long = 1  '/ Required volume is succesfully opened.
  71.                                            '/ This is not a notification call and ArcName
  72.                                            '/ modification is not allowed.
  73.                                            '/ The function should return non-zero value to
  74.                                            '/ continue or a zero-value to terminate the
  75.                                            '/ operation
  76.   
  77.   Type RARHeaderData
  78.     ArcName As String * 260
  79.     FileName As String * 260
  80.     Flags As Long
  81.     PackSize As Long
  82.     UnpSize As Long
  83.     HostOS As Long
  84.     FileCRC As Long
  85.     FileTime As Long
  86.     UnpVer As Long
  87.     Method As Long
  88.     FileAttr As Long
  89.     CmtBuf As String
  90.     CmtBufSize As Long
  91.     CmtSize As Long
  92.     CmtState As Long
  93.   End Type
  94.  
  95.   Type RAROpenArchiveData
  96.     ArcName As String
  97.     OpenMode As Long
  98.     OpenResult As Long
  99.     CmtBuf As String
  100.     CmtBufSize As Long
  101.     CmtSize As Long
  102.     CmtState As Long
  103.   End Type
  104.  
  105. Declare Function RAROpen Lib "unrar.dll" Alias "RAROpenArchive" _
  106.                  (ByRef RAROpenData As RAROpenArchiveData) As Long
  107.                  
  108. Declare Function RARClose Lib "unrar.dll" Alias "RARCloseArchive" _
  109.                  (ByVal HandleToArchive As Long) As Long
  110.                  
  111. Declare Function RARReadHdr Lib "unrar.dll" Alias "RARReadHeader" _
  112.                  (ByVal HandleToArcRecord As Long, ByRef ArcHeaderRead As RARHeaderData) As Long
  113.                  
  114. Declare Function RARProcFile Lib "unrar.dll" Alias "RARProcessFile" _
  115.                  (ByVal HandleToArcHeader As Long, ByVal Operation As Long, ByVal DestPath As String, ByVal DestName As String) As Long
  116.  
  117. Declare Function RARSetPassword Lib "unrar.dll" _
  118.                  (ByVal HandleToArchive As Long, ByVal Password As String) As Long
  119.  
  120. Declare Function RARSetChangeVolProc Lib "unrar.dll" _
  121.                  (ByVal HandleToArchive As Long, ByVal mode As Long) As Long
  122.  
  123.  
  124. Function ExtractRAR(sExtractDir As String, sArchName As String, lblRarFile As Label, lblRarArch As Label, lblRarProc As Label, picRarProc As PictureBox, Optional sRarPassword As String)
  125.    
  126.  ' check if the selected archive exists otherwise program would crash
  127.  
  128.  i = Dir(sArchName)
  129.    If i = "" Then MsgBox "Archive " & sArchName & " not found!", vbCritical: Exit Function
  130.  
  131.  ' check if the sExtractDir end with "\"
  132.  
  133.  If Right(sExtractDir, 1) <> "\" Then sExtractDir = sExtractDir & "\"
  134.  
  135.  ' open the archive for testing
  136.  
  137.     udtRAR.ArcName = sExtractDir
  138.     udtRAR.ArcName = sArchName
  139.     udtRAR.OpenMode = RAR_OM_LIST
  140.     lHandle = RAROpen(udtRAR)
  141.     lBytesCount = 0
  142.     lBytesTotal = 0
  143.     RAR_ABORT = False
  144. Do
  145.   rtnRar = RARReadHdr(lHandle, udtHeader)
  146.  
  147.     
  148.     If rtnRar = 0 Then
  149.        lblRarArch.Caption = "testing - " & StripDirPath(LCase(udtHeader.ArcName)): lblRarArch.Refresh
  150.        lblRarFile.Caption = "testing - " & LCase(udtHeader.FileName): lblRarFile.Refresh
  151.        tmp = RARProcFile(lHandle, RAR_TEST, sExtractDir, sExtractDir & udtHeader.FileName)
  152.         If tmp <> 0 Then
  153.            i = RarErrorHandle(tmp)
  154.            If i = False Then Exit Function
  155.            End If
  156.        lBytesTotal = lBytesTotal + udtHeader.UnpSize
  157.     DoEvents
  158.     Else
  159.      i = RarErrorHandle(rtnRar)
  160.       If i = False Then Exit Function
  161.     End If
  162.  
  163. If RAR_ABORT = True Then Exit Function
  164.  
  165. Loop Until rtnRar <> 0
  166.  
  167.   tmp = RARClose(lHandle)
  168.   i = RarErrorHandle(tmp)
  169.     If i = False Then Exit Function
  170.     
  171.  ' clear progressbar & progresslabel
  172.  
  173.  picRarProc.Line (0, 0)-(picRarProc.Width, picRarProc.Height), picRarProc.BackColor, BF
  174.  lblRarProc.Caption = "0%"
  175.  
  176.  ' now open to extract
  177.     
  178.     udtRAR.ArcName = sExtractDir
  179.     udtRAR.ArcName = sArchName
  180.     udtRAR.OpenMode = RAR_OM_EXTRACT
  181.     lHandle = RAROpen(udtRAR)
  182.     lBytesCount = 0
  183.     If sRarPassword <> "" Then RARSetPassword lHandle, sRarPassword
  184.     
  185. Dim Cnt
  186. Do
  187.     rtnRar = RARReadHdr(lHandle, udtHeader)
  188.     
  189.     If rtnRar = 0 Then
  190.        lblRarArch.Caption = StripDirPath(LCase(udtHeader.ArcName)):  lblRarArch.Refresh
  191.        lblRarFile.Caption = LCase(udtHeader.FileName): lblRarFile.Refresh
  192.        
  193.        tmp = RARProcFile(lHandle, RAR_EXTRACT, sExtractDir, sExtractDir & udtHeade